package sistema.web.dao.impls;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import sistema.web.dao.IDiaCampoDAO;
import sistema.web.dtos.DiaCampoDetalleDTO;
import sistema.web.dtos.JuegoDTO;
import sistema.web.dtos.ServicioDTO;
import sistema.web.utils.MySQLConnection;

public class DiaCampoDAO implements IDiaCampoDAO {

	public boolean registrar(String fecha, int idClub, int nroParticipantes, List<ServicioDTO> listServicio, List<JuegoDTO> listJuego, String idOferta, double montoTotal, int idUsuario) {
		boolean flag = true;
		
		try {
			Connection conn = MySQLConnection.getConnection();
			
			String query = "INSERT INTO diacampo (Fecha, idClub, CantParticipantes, idUsuarioCreacion, FechaCreacion, Estado, idPersona) VALUES ('" + fecha + "', " + idClub + ", " + nroParticipantes + ", " + idUsuario + ", curdate() , 1, " + idUsuario + ")";
			
			PreparedStatement pst = conn.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
			pst.executeUpdate();
			
			ResultSet generatedKey = pst.getGeneratedKeys();
			if(generatedKey.next()) {
				int idDiaCampo = generatedKey.getInt(1);;
				/* -- Servicio -- */
				for(int index = 0; index < listServicio.size(); index++) {
					ServicioDTO dtoServicio = listServicio.get(index);
					
					String queryServicio = "INSERT INTO diacamposervicios (DiaCampo_idDiaCampo, Servicio_idServicio, CantPersonas, Costo, Monto, DescripcionAdicional) VALUES (" + idDiaCampo + ", " + dtoServicio.getIdServicio() + ", " + dtoServicio.getNroPersona() + ", " + dtoServicio.getCosto() + ", " + dtoServicio.getNroPersona() * dtoServicio.getCosto() + ", '" + dtoServicio.getDescripcion() + "')";
					
					pst = conn.prepareStatement(queryServicio);
					pst.executeUpdate();
				}
				/* -- Juego -- */
				for(int index = 0; index < listJuego.size(); index++) {
					JuegoDTO dtoJuego = listJuego.get(index);
					
					String queryJuego = "INSERT INTO diacampojuegos (DiaCampo_idDiaCampo, Juego_idJuego, CantPersonas, Costo, Monto, DescripcionAdicional) VALUES (" + idDiaCampo + ", " + dtoJuego.getIdJuego() + ", " + dtoJuego.getNroPersona() + ", " + dtoJuego.getCosto() + ", " + dtoJuego.getNroPersona() * dtoJuego.getCosto() + ", '" + dtoJuego.getDescripcion() + "')";
					
					pst = conn.prepareStatement(queryJuego);
					pst.executeUpdate();
				}
				
				/* -- Cotizacion -- */
				String queryCotizacion;
				if(idOferta != null && idOferta.length() != 0) {
					queryCotizacion = "INSERT INTO cotizacion (MontoTotal, idDiaCampo) VALUES (" + montoTotal + ", " + idDiaCampo + ")";				
				} else {
					queryCotizacion = "INSERT INTO cotizacion (MontoTotal, Oferta_idOferta, idDiaCampo) VALUES (" + montoTotal + ", " + idOferta + ", " + idDiaCampo + ")";
				}
				
				pst = conn.prepareStatement(queryCotizacion);
				pst.executeUpdate();
			}
						
		} catch (Exception e) {
			e.printStackTrace();
			flag = false;
		}
		
		return flag;
	}

	public boolean actualizar(int codigo, String fecha, int idClub, int nroParticipantes, List<ServicioDTO> listServicio, List<JuegoDTO> listJuego, String idOferta, double montoTotal, int idUsuario) {
		boolean flag = true;
		
		try {
			Connection conn = MySQLConnection.getConnection();
			
			String query = "UPDATE diacampo SET Fecha = '" + fecha + "', idClub = " + idClub + ", CantParticipantes = " + nroParticipantes + ", idUsuarioModificacion = " + idUsuario + ", FechaModificacion = curdate() WHERE idDiaCampo = " + codigo;
			
			PreparedStatement pst = conn.prepareStatement(query);
			pst.executeUpdate();
						
			/* -- Servicio -- */
			String queryServicio = "DELTE FROM diacamposervicios WHERE DiaCampo_idDiaCampo = " + codigo;
			pst = conn.prepareStatement(queryServicio);
			
			for(int index = 0; index < listServicio.size(); index++) {
				ServicioDTO dtoServicio = listServicio.get(index);
				
				queryServicio = "INSERT INTO diacamposervicios (DiaCampo_idDiaCampo, Servicio_idServicio, CantPersonas, Costo, Monto, DescripcionAdicional) VALUES (" + codigo + ", " + dtoServicio.getIdServicio() + ", " + dtoServicio.getNroPersona() + ", " + dtoServicio.getCosto() + ", " + dtoServicio.getNroPersona() * dtoServicio.getCosto() + ", '" + dtoServicio.getDescripcion() + "')";
				
				pst = conn.prepareStatement(queryServicio);
				pst.executeUpdate();
			}
			
			/* -- Juego -- */
			String queryJuego = "DELETE FROM diacampojuegos WHERE DiaCampo_idDiaCampo = " + codigo;
			pst = conn.prepareStatement(queryJuego);
			
			for(int index = 0; index < listJuego.size(); index++) {
				JuegoDTO dtoJuego = listJuego.get(index);
				
				queryJuego = "INSERT INTO diacampojuegos (DiaCampo_idDiaCampo, Juego_idJuego, CantPersonas, Costo, Monto, DescripcionAdicional) VALUES (" + codigo + ", " + dtoJuego.getIdJuego() + ", " + dtoJuego.getNroPersona() + ", " + dtoJuego.getCosto() + ", " + dtoJuego.getNroPersona() * dtoJuego.getCosto() + ", '" + dtoJuego.getDescripcion() + "')";
				
				pst = conn.prepareStatement(queryJuego);
				pst.executeUpdate();
			}

			/* -- Cotizacion -- */
			String queryCotizacion;
			if(idOferta != null && idOferta.length() != 0) {
				queryCotizacion = "INSERT INTO cotizacion (MontoTotal, idDiaCampo) VALUES (" + montoTotal + ", " + codigo + ")";				
			} else {
				queryCotizacion = "INSERT INTO cotizacion (MontoTotal, Oferta_idOferta, idDiaCampo) VALUES (" + montoTotal + ", " + idOferta + ", " + codigo + ")";
			}
			
			pst = conn.prepareStatement(queryCotizacion);
			pst.executeUpdate();
			
		} catch (Exception e) {
			e.printStackTrace();
			flag = false;
		}
		
		return flag;
	}

	public List<DiaCampoDetalleDTO> listar(int idDiaCampo) {
		List<DiaCampoDetalleDTO> listDetalle = null;
		
		try {
			Connection conn = MySQLConnection.getConnection();
			
			String query = 
				"SELECT " +
				"   * " +
				"FROM " +
				"   diacampojuegos dia, " +
				"   juego jue " +
				"WHERE " +
				"   dia.Juego_idJuego = jue.idJuego " +
				"   AND DiaCampo_idDiaCampo =  " + idDiaCampo
			;
			
			PreparedStatement pst = conn.prepareStatement(query);
			ResultSet rs = pst.executeQuery();
			listDetalle = new ArrayList<DiaCampoDetalleDTO>();
			while(rs.next()) {
				DiaCampoDetalleDTO dtoDetalle = new DiaCampoDetalleDTO();
				
				dtoDetalle.setIdDiaCampo(idDiaCampo);
				dtoDetalle.setCantPersonas(rs.getInt("dia.CantPersonas"));
				dtoDetalle.setDescripcion(rs.getString("dia.DescripcionAdicional"));
				dtoDetalle.setCosto(rs.getDouble("dia.Costo"));
				dtoDetalle.setMonto(rs.getDouble("dia.Monto"));
				dtoDetalle.setIdServicioJuego(rs.getInt("dia.Juego_idJuego"));
				dtoDetalle.setNombre(rs.getString("jue.Nombre"));
				
				listDetalle.add(dtoDetalle);
			}
			
			query = 
				"SELECT " +
				"   * " +
				"FROM " +
				"   diacamposervicios dia, " +
				"   servicio ser " +
				"WHERE " +
				"   dia.Servicio_idServicio = ser.idServicio " +
				"   AND DiaCampo_idDiaCampo =  " + idDiaCampo
			;
			
			pst = conn.prepareStatement(query);
			rs = pst.executeQuery();			
			while(rs.next()) {
				DiaCampoDetalleDTO dtoDetalle = new DiaCampoDetalleDTO();
				
				dtoDetalle.setIdDiaCampo(idDiaCampo);
				dtoDetalle.setCantPersonas(rs.getInt("dia.CantPersonas"));
				dtoDetalle.setDescripcion(rs.getString("dia.DescripcionAdicional"));
				dtoDetalle.setCosto(rs.getDouble("dia.Costo"));
				dtoDetalle.setMonto(rs.getDouble("dia.Monto"));
				dtoDetalle.setIdServicioJuego(rs.getInt("dia.Servicio_idServicio"));
				dtoDetalle.setNombre(rs.getString("ser.Nombre"));

				listDetalle.add(dtoDetalle);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return listDetalle;
	}
}